Kafka Streams State Store

Kafka Streams默认使用RocksDB来存储状态

In-memory or persistent ?

状态可配置为保存在内存中或者持久化,RocksDB对于两者都适用,并且可以通过Stores factory API在两者间切换。StateStoreSupplier被创建之后,可以用于Kafka Streams DSL API(high level),也可以用于Processor API(low level)

持久化

为了保存状态,RocksDB会把state store的内容flush到StreamsConfig.STATE_DIR_CONFIG指定的磁盘上

1
config.put(StreamsConfig.STATE_DIR_CONFIG, "my-state-store")

Changelog

出于灾备和扩展性的考虑,state store的内容同样会默认保存changelog到kafka的topic中,topic名字为<application_id>-<state_store_name>-changelog,你可以通过enableLogging和disableLogging来开启或关闭该功能

如果task由于异常或宕机造成中断,在原来的机器或另一台机器重启之后,Kafka Streams能够优先通过重放changelog恢复state store的内容,而不是在新的task中创建新的state store,这是Kafka Streams状态安全性的保证

如果在task运行过程中删除changelog对应的topic,Kafka Streams会在下一个checkpoint再次写入changelog,但如果在下个checkpoint之前task中断,state store的数据将无法恢复